#pragma once
#include <string>
#include <functional>
#include <chrono>

#ifdef TIMELINE_EXPORTS
#define TIMELINE_API __declspec(dllexport)
#else
#define TIMELINE_API __declspec(dllimport)
#endif

class TIMELINE_API Timeline {
public:
    using TimePoint = std::chrono::system_clock::time_point;
    using Callback = std::function<void(const std::string&)>;

    Timeline();

    // 获取当前日期（格式：YYYY-MM-DD）
    std::string getCurrentDate() const;

    // 推进到下一天，返回新的日期
    std::string advanceToNextDay();

    // 重置到起始日期（2020-01-01）
    void reset();

    // 检查是否已经到达今天
    bool hasReachedToday() const;

    // 注册回调函数，当日期变化时会被调用
    void registerCallback(Callback callback);

    // 在数据更新完之后, 调用事件函数
    void registerCallback_after(Callback callback);

    // 设置日期
    void setDate(const std::string& date);

    // 取N天前的时间
    static std::string getNDaysAgo(const std::string &date,int n);
private:
    TimePoint current_;
    TimePoint today_;
    std::vector<Callback> callbacks_;
    // 在数据更新后调用
    std::vector<Callback> callbacks_after;

    // 将TimePoint转换为日期字符串
    std::string timePointToString(const TimePoint& tp) const;
}; 